import random
import time
from datetime import datetime


def load_participants():
    """加载参与人员列表（支持手动输入/文件导入）"""
    print("=" * 50)
    print("          随机抽人工具")
    print("=" * 50)
    # 选择加载方式
    load_mode = input("请选择参与人员加载方式（1=手动输入 2=从txt文件导入）：")

    participants = []
    if load_mode == "1":
        # 手动输入模式
        print("\n【手动输入模式】：请输入参与人员姓名（输入'完成'结束）")
        while True:
            name = input("请输入姓名：").strip()
            if name == "完成":
                break
            if name and name not in participants:
                participants.append(name)
            elif not name:
                print("❌ 姓名不能为空，请重新输入！")
            else:
                print(f"⚠️  姓名'{name}'已存在，无需重复添加！")

    elif load_mode == "2":
        # TXT文件导入模式（每行1个姓名）
        file_path = input("\n【文件导入模式】：请输入txt文件路径（如：./participants.txt）：").strip()
        try:
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    name = line.strip()
                    if name and name not in participants:
                        participants.append(name)
            print(f"✅ 成功导入 {len(participants)} 名参与人员！")
        except Exception as e:
            print(f"❌ 文件导入失败：{str(e)}，将自动切换为手动输入模式！")
            # 失败后切换手动输入
            print("\n【手动输入模式】：请输入参与人员姓名（输入'完成'结束）")
            while True:
                name = input("请输入姓名：").strip()
                if name == "完成":
                    break
                if name and name not in participants:
                    participants.append(name)

    else:
        # 模式选择错误，默认手动输入
        print("❌ 输入错误，默认使用手动输入模式！")
        print("\n【手动输入模式】：请输入参与人员姓名（输入'完成'结束）")
        while True:
            name = input("请输入姓名：").strip()
            if name == "完成":
                break
            if name and name not in participants:
                participants.append(name)

    # 验证参与人员列表
    if not participants:
        print("❌ 参与人员列表为空，程序退出！")
        exit()
    print(f"\n✅ 最终参与人员列表（共 {len(participants)} 人）：")
    for i, name in enumerate(participants, 1):
        print(f"   {i}. {name}")
    return participants


def random_draw(participants):
    """执行随机抽奖"""
    # 设置抽奖参数
    print("\n" + "=" * 30)
    print("          抽奖设置")
    print("=" * 30)
    # 输入抽奖次数（默认1次）
    try:
        draw_count = int(input("请输入抽奖次数（默认1次）：").strip() or "1")
        if draw_count <= 0:
            print("⚠️  抽奖次数不能为负数，默认设置为1次！")
            draw_count = 1
    except:
        print("⚠️  输入错误，默认设置为1次抽奖！")
        draw_count = 1

    # 选择是否允许重复中奖（默认不允许）
    repeat_mode = input("是否允许重复中奖（1=允许 2=不允许，默认2）：").strip() or "2"
    used_names = []  # 记录已中奖人员（避免重复）

    # 执行抽奖
    print(f"\n🎉 开始 {draw_count} 次抽奖（{'允许重复中奖' if repeat_mode == '1' else '不允许重复中奖'}）")
    print("-" * 50)

    # 抽奖结果记录
    draw_results = []
    for i in range(draw_count):
        print(f"\n【第 {i + 1} 次抽奖】")
        # 模拟抽奖动画（增强体验）
        print("正在随机抽取...", end="")
        for _ in range(5):
            time.sleep(0.3)
            print(".", end="", flush=True)
        print()

        # 筛选可选人员（排除已中奖者，若不允许重复）
        available = participants if repeat_mode == "1" else [p for p in participants if p not in used_names]
        if not available:
            print("❌ 无可用参与人员（已无未中奖者），抽奖结束！")
            break

        # 随机选择中奖者
        winner = random.choice(available)
        # 记录已中奖者
        if repeat_mode == "2":
            used_names.append(winner)
        # 记录抽奖结果
        draw_results.append({
            "抽奖次数": i + 1,
            "中奖者": winner,
            "抽奖时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        })

        # 输出结果
        print(f"🏆 中奖者：{winner}")

    return draw_results


def save_results(draw_results, participants):
    """保存抽奖结果到文件"""
    if not draw_results:
        return
    # 询问是否保存
    save_choice = input("\n是否需要将抽奖结果保存到txt文件（1=是 2=否，默认2）：").strip() or "2"
    if save_choice != "1":
        return

    # 生成文件名（含时间戳，避免重复）
    file_name = f"抽奖结果_{datetime.now().strftime('%Y%m%d%H%M%S')}.txt"
    try:
        with open(file_name, "w", encoding="utf-8") as f:
            # 写入基本信息
            f.write("=" * 50 + "\n")
            f.write("          随机抽人结果\n")
            f.write("=" * 50 + "\n")
            f.write(f"参与人员总数：{len(participants)} 人\n")
            f.write(f"参与人员列表：{', '.join(participants)}\n")
            f.write(f"抽奖总次数：{len(draw_results)} 次\n")
            f.write(f"抽奖时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write("=" * 50 + "\n\n")

            # 写入每次抽奖结果
            for res in draw_results:
                f.write(f"【第 {res['抽奖次数']} 次】\n")
                f.write(f"中奖者：{res['中奖者']}\n")
                f.write(f"时间：{res['抽奖时间']}\n")
                f.write("-" * 30 + "\n")

        print(f"✅ 抽奖结果已保存到：{file_name}")
    except Exception as e:
        print(f"❌ 保存结果失败：{str(e)}")


def main():
    """主程序入口"""
    # 1. 加载参与人员
    participants = load_participants()
    if not participants:
        return
    # 2. 执行抽奖
    draw_results = random_draw(participants)
    # 3. 保存结果（可选）
    save_results(draw_results, participants)
    # 结束提示
    print("\n" + "=" * 50)
    print("          抽奖结束，感谢使用！")
    print("=" * 50)


if __name__ == "__main__":
    main()